#include "ArrayList.h"

template <typename T> ArrayList<T>::~ArrayList()
{
	delete [] array;
	array_length = 0;
}
template <typename T> ArrayList<T>::ArrayList()
{
	array_length = 0;
}
template <typename T> ArrayList<T>::ArrayList(vector<T> vect)
{
	array_length = vect.size();
	array = new T[vect.size()];
	for(uint i = 0; i < vect.size(); i++)
		array[i] = vect[i];
}
template <typename T> ArrayList<T>::ArrayList(uint num)
{
	array_length = num;
	array = new T[num];
}
template <typename T> ArrayList<T> ArrayList<T>::operator=(vector<T> vect)
{
	array_length = vect.size();
	array = new T[vect.size()];
	for(uint i = 0; i < vect.size(); i++)
		array[i] = vect[i];
	return ArrayList<T>(vect);
}
template <typename T> ArrayList<T> ArrayList<T>::operator= (ArrayList<T> alist)
{
	array_length = alist.size();
	array = new T[alist.size()];
	for(uint i = 0; i < alist.size(); i++)
		array[i] = alist[i];
	return alist;
}
template <typename T> uint ArrayList<T>::add(T obj)
{
	T *tarr = new T[array_length + 1];
	for(uint i = 0; i < array_length; i++)
	{
		tarr[i] = array[i];
	}
	tarr[array_length] = obj;
	array = tarr;
	array_length++;
	return array_length - 1;
}
template <typename T> uint ArrayList<T>::add(uint at, T obj)
{
	T *tarr = new T[array_length + 1];
	for(uint i = 0; i < at; i++)
	{
		tarr[i] = array[i];
	}
	for(uint i = array_length; i > at; i--)
	{
		tarr[i] = array[i];
	}
	tarr[at] = obj;
	array = tarr;
	array_length++;
	return at;
}
template <typename T> uint ArrayList<T>::push_back(T obj)
{
	T *tarr = new T[array_length + 1];
	for(uint i = 0; i < array_length; i++)
	{
		tarr[i] = array[i];
	}
	tarr[array_length] = obj;
	array = tarr;
	array_length++;
	return array_length - 1;
}
template <typename T> uint ArrayList<T>::size()
{
	return array_length;
}
template <typename T> T& ArrayList<T>::at(uint index)
{
	return array[index];
}
template <typename T> T& ArrayList<T>::get(uint index)
{
	return array[index];
}
template <typename T> T& ArrayList<T>::operator[](uint index)
{
	return array[index];
}
template <typename T> void ArrayList<T>::swap(uint loc1, uint loc2)
{
	T temp = array[loc1];
	array[loc1] = array[loc2];
	array[loc2] = temp;
}
template <typename T> void ArrayList<T>::set(uint index, T obj)
{
	array[index] = obj; 
}
template <typename T> void ArrayList<T>::remove(uint at)
{
	T tarr[array_length - 1];
	for(uint i = 0, z = 0; i < array_length; i++)
	{
		if(i != at)
		{
			tarr[z] = array[i];
			z++;
		}
	}
}
template <typename T> bool ArrayList<T>::contains(T obj)
{
	if(indexOf(obj) != -1)
		return true;
	else
		return false;
}
template <typename T> uint ArrayList<T>::indexOf(T obj)
{
	for(uint i = 0; i < array_length; i++)
	{
		if(array[i] == obj)
			return i;
	}
	return -1;
}
template <typename T> uint ArrayList<T>::lastIndexOf(T obj)
{
	for(uint i = array_length -1; i >= 0; i--)
	{
		if(array[i] == obj)
			return i;
	}
	return -1;
}
